package biblioteca.model;

import java.util.ArrayList;

import com.mysql.jdbc.PreparedStatement;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import biblioteca.controller.ItemIndisponivelException;
import biblioteca.controller.ItemNaoEncontradoException;

/**
 * 
 * Classe responsavel por construir todos os Itens do
 * acervo de livros e apostilas, com seus repectivos 
 * metodos de adicionar, remover, listar itens e
 * retornar total de itens. Atributos: itens, connection e stmt.
 *
 *@author willen leiros e fabio queiroz
 */
public class Acervo {
	ArrayList<ItemAcervo> itens;
	private Connection connection;
	PreparedStatement stmt;
	
	/**
	 * Costrutor de Acervo sem parametros.
	 * Construindo objetos do banco de dados
	 */
	public Acervo(){
		
		itens = new ArrayList<ItemAcervo>();
		this.connection = new ConnectionFactory().getConnection();
		
	}
	
	/**
	 * Esse metodo retorna um Item do Acervo. A busca e feita pelo titulo do Item
	 * @param titulo do tipo String: Titulo do ItemAcervo.
	 * @return ItemAcervo
	 * @throws ItemNaoEncontradoException Lanca uma mensagem de erro: ItemAcervo nao encontrado. 
	 * @throws ItemIndisponivelException Lanca uma mensagem de erro: ItemAcervo indisponivel (Locado).
	 */
	
	public ItemAcervo getItem(String titulo) 
					throws ItemNaoEncontradoException, ItemIndisponivelException{
		
		try {
			Livro livro = null;
			Apostila apostila = null;
			
			stmt = (PreparedStatement) this.connection
					.prepareStatement("select * from Leiros01.Item where titulo = "+"\'"+titulo+"\'");
			
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				
				if (rs.getString("isbn") != null){
					livro = new Livro();
					livro.setCodItem(rs.getLong("codItem"));
					livro.setAcervoCodAcervo(rs.getLong("Acervo_codAcervo"));
					livro.setTitulo(rs.getString("titulo"));
					livro.setAutor(rs.getString("autor"));
					livro.setIsbn(rs.getString("isbn"));
					livro.setEdicao(rs.getLong("edicao"));
					livro.setSituacao(rs.getString("situacao"));
				}else{
					apostila = new Apostila();
					apostila.setCodItem(rs.getLong("codItem"));
					apostila.setAcervoCodAcervo(rs.getLong("Acervo_codAcervo"));
					apostila.setTitulo(rs.getString("titulo"));
					apostila.setAutor(rs.getString("autor"));
					apostila.setQtdPaginas(rs.getInt("qtdPaginas"));
					apostila.setSituacao(rs.getString("situacao"));
				}
				
			}
			
			rs.close();
			stmt.close();
			
			if (livro != null){
				if (livro.getSituacao().equalsIgnoreCase("Indisponivel")){
					throw new ItemIndisponivelException("Item Indisponivel");
				}
				return livro;
			}
			else if (apostila != null){
				if (apostila.getSituacao().equalsIgnoreCase("Indisponivel")){
					throw new ItemIndisponivelException("Item Indisponivel");
				}
				return apostila;
			}
			else{
				throw new ItemNaoEncontradoException("Item não encontrado...");
			}
		} 
		
		catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * Esse metodo retorna um Item do Acervo. A busca e feita pelo codigo do ItemAcervo
	 * @param codItem Parametro do tipo inteiro que representa o codigo do ItemAcervo 
	 * @return ItemAcervo
	 * @throws ItemNaoEncontradoException Lanca uma mensagem de erro: ItemAcervo nao encontrado.
	 */
	
	public ItemAcervo getItem(int codItem) 
				throws ItemNaoEncontradoException{
		
		try {
			Livro livro = null;
			Apostila apostila = null;
			
			stmt = (PreparedStatement) this.connection
					.prepareStatement("select * from Leiros01.Item where codItem = "+codItem);
			
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				
				if (rs.getString("isbn") == null){
					livro = new Livro();
					livro.setCodItem(rs.getLong("codItem"));
					livro.setAcervoCodAcervo(rs.getLong("Acervo_codAcervo"));
					livro.setTitulo(rs.getString("titulo"));
					livro.setAutor(rs.getString("autor"));
					livro.setIsbn(rs.getString("isbn"));
					livro.setEdicao(rs.getLong("edicao"));
					livro.setSituacao(rs.getString("situacao"));
					
				}else{
					apostila = new Apostila();
					apostila.setCodItem(rs.getLong("codItem"));
					apostila.setAcervoCodAcervo(rs.getLong("Acervo_codAcervo"));
					apostila.setTitulo(rs.getString("titulo"));
					apostila.setAutor(rs.getString("autor"));
					apostila.setQtdPaginas(rs.getInt("qtdPaginas"));
					apostila.setSituacao(rs.getString("situacao"));
					
				}
				
			}
			
			rs.close();
			stmt.close();
			
			if (livro != null){
				return livro;
			}
			else if (apostila != null){
				return apostila;
			}
			else{
				throw new ItemNaoEncontradoException("Item não encontrado...");
			}
		} 
		catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}
